const fs = require("fs");
const path = require("path");

// 1.读取文件文件不存在会报错
// 2.写入文件的时候 文件不存在 会创建这个文件，如果文件中有内容会清空文件内容
// fs.readFile(path.resolve(__dirname, "name.txt"), function (err, data) {
//   if (err) return console.log(err);
//   // 这种模式如果文件内容 是非常的大，不能采用此操作, 淹没可用内存
//   fs.writeFile(path.resolve(__dirname, "copy.txt"), data, function (err) {
//     if (err) return console.log(err);
//     console.log("写入成功");
//   });
// });

// 读取一部分操作一部分，  流水线的过程 （流）

// fs 中提供了 可以按照需要去读取，而不是直接读取整个文件的方式
// 用起来会比较麻烦

const buf = Buffer.alloc(3); // 我希望一次读取3个字节

// flags: 表示打开文件我们要干什么？
// r -> read 如果文件不存在会报错的  fs.readFile
// r+ 在读取的基础上能写入，如果文件不存在会报错的
// w -> write 要写入内容， 如果文件不存在会创建，如果有内容会清空文件  fs.writeFile
// w+ 在写入的基础上增加读取的功能， 如果文件不存在会创建，如果有内容会清空文件
// a 追加， 如果文件不存在会创建，如果有内容会追加内容    fs.appendFile

// fs.open(path.resolve(__dirname, "name.txt"), "r", function (err, fd) {
//   // fd file-descriptor 表示我们当前操作的文件是name.txt 而且是要做读取操作  number类型
//   // 所谓的读取还是写入 是有参照物的
//   // 将这个数据写入到buffer中，从buffer第0个位置写入 写入3个
//   fs.read(fd, buf, 0, 3, 0, function (err, bytesRead) {
//     // bytesRead 真正的写入个数

//     // mode   rwx   r-x            r-x
//     //        用户   用户所在的组    其他人
//     //     1 执行  2 写入 4 读取
//     // 755  chomd -R 777
//     // 0o666  -> 438
//     fs.open(path.resolve(__dirname, "copy.txt"), "w", 438, function (err, wfd) {
//       // 写入这个buffer，从buffer的第0个位置开始写入,写入的个数
//       fs.write(wfd, buf, 0, bytesRead, 0, function (err) {
//         console.log("写入成功");
//       });
//     });
//   });
// });

fs.open(path.resolve(__dirname, "name.txt"), "r", function (err, fd) {
  fs.open(path.resolve(__dirname, "copy.txt"), "w", 438, function (err, wfd) {
    let readOffset = 0;
    let writeOffset = 0;
    // ------
    ~(function next() {
      fs.read(fd, buf, 0, buf.length, readOffset, function (err, bytesRead) {
        readOffset += bytesRead;
        fs.write(wfd, buf, 0, bytesRead, writeOffset, function (err, written) {
          // 写入的个数
          writeOffset += written;
          if (bytesRead < buf.length) {
            // 每次判断一下读取的个数 是否小于 buffer的长度
            return console.log("拷贝完毕");
          }
          next();
        });
      });
    })();
    // ------
  });
});
// 读写需要做分离， 以上代码是耦合在一起的，没有通用性， 如果我只希望对文件做读取操作？ 只希望写入内容？
// 解开耦合？ 通过发布订阅模式解耦合
